কেন আপনি আপনার Node.js অ্যাপ্লিকেশন পরীক্ষা করা উচিত?
পরীক্ষা সফ্টওয়্যার বিকাশের একটি অপরিহার্য অংশ এবং এটি অনেক সুবিধা প্রদান করে:
ত্রুটি সনাক্তকরণ
প্রোডাকশনে পৌঁছানোর আগে বাগগুলি খুঁজুন এবং ঠিক করুন
সূচক গুণমান
কোড মানের মান প্রয়োগ করুন এবং রিগ্রেশন প্রতিরোধ করুন
ডকুমেন্টেশন
পরীক্ষাগুলি আপনার কোডের জন্য এক্সিকিউটেবল ডকুমেন্টেশন হিসাবে কাজ করে
আশা
পরিবর্তন এবং রিফ্যাক্টরিং কোডে আত্মবিশ্বাস তৈরি করুন
সহযোগিতা
কোড কিভাবে কাজ করা উচিত তা বুঝতে দলের সদস্যদের সাহায্য করুন
CI/CD
ক্রমাগত ইন্টিগ্রেশন এবং ডেলিভারি পাইপলাইন চালান
Node.js-এ পরীক্ষার ধরন
ইউনিট পরীক্ষা
ইউনিট পরীক্ষাগুলি যাচাই করে যে স্বতন্ত্র উপাদান (ফাংশন, পদ্ধতি, ক্লাস) নির্ভরতার জন্য উপহাস ব্যবহার করে বিচ্ছিন্নভাবে প্রত্যাশিতভাবে কাজ করে।
উদাহরণ: Node.js Assert দিয়ে ইউনিট টেস্টিং
calculator.js
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Both arguments must be numbers');
}
return a + b;
}
function subtract(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Both arguments must be numbers');
}
return a - b;
}
module.exports = { add, subtract };
test/calculator.test.js
const assert = require('assert');
const { add, subtract } = require('./calculator');
// Test the add function
assert.strictEqual(add(1, 2), 3, 'Addition not working correctly');
assert.strictEqual(add(-1, 1), 0, 'Addition with negative numbers not working');
// Test the subtract function
assert.strictEqual(subtract(5, 2), 3, 'Subtraction not working correctly');
assert.strictEqual(subtract(2, 5), -3, 'Subtraction resulting in negative not working');
console.log('All tests passed!');
ইন্টিগ্রেশন টেস্টিং
ইন্টিগ্রেশন পরীক্ষা যাচাই করে যে একাধিক উপাদান একসাথে সঠিকভাবে কাজ করে, যেমন ডাটাবেস অপারেশন, API এন্ডপয়েন্ট বা তৃতীয় পক্ষের পরিষেবা মিথস্ক্রিয়া পরীক্ষা করা।
উদাহরণ: একটি সাধারণ API এন্ডপয়েন্ট পরীক্ষা করা
app.js
const express = require('express');
const app = express();
app.get('/users', (req, res) => {
res.json([
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' }
]);
});
module.exports = app;
test.js
const assert = require('assert');
const http = require('http');
const app = require('./app');
// Start the server
const server = app.listen(8080);
// Make a request to the API
http.get('http://localhost:8080/users', (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
const users = JSON.parse(data);
// Verify the response
assert.strictEqual(res.statusCode, 200, 'Status code should be 200');
assert.strictEqual(users.length, 2, 'Should return two users');
assert.strictEqual(users[0].name, 'Alice', 'First user should be Alice');
assert.strictEqual(users[1].name, 'Bob', 'Second user should be Bob');
console.log('API test passed!');
// Close the server
server.close();
});
}).on('error', (err) => {
console.error('Test failed:', err);
server.close();
});
এন্ড-টু-এন্ড টেস্টিং
পুঙ্খানুপুঙ্খ পরীক্ষাগুলি প্রকৃত ব্যবহারকারীর পরিস্থিতি এবং মিথস্ক্রিয়া অনুকরণ করে শুরু থেকে শেষ পর্যন্ত সম্পূর্ণ অ্যাপ্লিকেশন প্রবাহ যাচাই করে।
দ্রষ্টব্য:
সম্পূর্ণ পরীক্ষাগুলি সেট আপ এবং রক্ষণাবেক্ষণের জন্য আরও জটিল, তবে আপনার অ্যাপ্লিকেশনটির কার্যকারিতা আরও পুঙ্খানুপুঙ্খভাবে পরীক্ষা করে।
টেস্ট-চালিত উন্নয়ন (TDD)
টেস্ট-চালিত বিকাশ একটি সফ্টওয়্যার বিকাশের পদ্ধতি যেখানে আপনি:
TDD উদাহরণ: একটি পাসওয়ার্ড যাচাইকারী তৈরি করা
password-validator.test.js
// 1. Write the test first
const assert = require('assert');
const validatePassword = require('./password-validator');
// Test for password length
assert.strictEqual(validatePassword('abc12'), false, 'Should reject passwords shorter than 8 characters');
assert.strictEqual(validatePassword('abcdef123'), true, 'Should accept passwords 8+ characters long');
// Test for number requirement
assert.strictEqual(validatePassword('abcdefgh'), false, 'Should reject passwords without numbers');
assert.strictEqual(validatePassword('abcdefg1'), true, 'Should accept passwords with numbers');
console.log('All password validation tests passed!');
// 2. Run the test - it will fail because validatePassword doesn't exist yet
password-validator.js
// 3. Write the simplest code to pass the tests
function validatePassword(password) {
// Check length (at least 8 characters)
if (password.length < 8) {
return false;
}
// Check if it contains at least one number
if (!/\d/.test(password)) {
return false;
}
return true;
}
module.exports = validatePassword;
// 4. Run the tests again - they should pass now
// 5. Refactor if needed, then repeat for new requirements
সর্বোত্তম অনুশীলন পরীক্ষা করা
পরীক্ষাযোগ্য কোড লিখুন
একক দায় নীতি
প্রতিটি ফাংশন একটি জিনিস ভাল করতে হবে
বিশুদ্ধ ফাংশন
পার্শ্ব প্রতিক্রিয়া ছাড়াই একই ইনপুটের জন্য একই আউটপুট উত্পাদন করে এমন ফাংশনগুলি পরীক্ষা করা সহজ
নির্ভরশীল ইনজেকশন
তাদের ভিতরে তৈরি করার পরিবর্তে ফাংশনগুলিতে নির্ভরতা পাস করুন
পরীক্ষা সেটআপ
টেস্ট কভারেজ
উচ্চ পরীক্ষার কভারেজের জন্য লক্ষ্য রাখুন, তবে জটিল পথ এবং প্রান্তের ক্ষেত্রে অগ্রাধিকার দিন:
একটি সুখী পথ
প্রত্যাশিত স্বাভাবিক প্রবাহ পরীক্ষা করুন
প্রান্তিক ক্ষেত্রে
সীমানা শর্ত এবং অস্বাভাবিক ইনপুট জন্য পরীক্ষা করুন
ত্রুটি হ্যান্ডলিং
যাচাই করুন যে ত্রুটিগুলি সঠিকভাবে পরিচালনা করা হয়েছে
টেস্ট রানটাইম বিবেচনা
উপহাস
পরীক্ষা করা কোডটিকে আলাদা করতে পরীক্ষার কপি দিয়ে বাস্তব নির্ভরতা প্রতিস্থাপন করুন:
উদাহরণ: একটি ডাটাবেস সংযোগ উপহাস করা
user-service.js
class UserService {
constructor(database) {
this.database = database;
}
async getUserById(id) {
const user = await this.database.findById(id);
if (!user) {
throw new Error('User not found');
}
return user;
}
}
module.exports = UserService;
user-service.test.js
const assert = require('assert');
const UserService = require('./user-service');
// Create a mock database
const mockDatabase = {
findById: async (id) => {
// Mock implementation returns test data
if (id === 1) {
return { id: 1, name: 'Alice', email: 'alice@example.com' };
}
return null;
}
};
async function testUserService() {
const userService = new UserService(mockDatabase);
// Test successful retrieval
const user = await userService.getUserById(1);
assert.strictEqual(user.name, 'Alice', 'Should retrieve correct user name');
// Test error handling
try {
await userService.getUserById(999);
assert.fail('Should have thrown an error for non-existent user');
} catch (error) {
assert.strictEqual(error.message, 'User not found', 'Should throw user not found error');
}
console.log('UserService tests passed!');
}
testUserService().catch(err => {
console.error('Test failed:', err);
});
অ্যাসিঙ্ক্রোনাস কোড পরীক্ষা করা হচ্ছে
Node.js .
নিশ্চিত করুন যে আপনার পরীক্ষাগুলি অ্যাসিঙ্ক্রোনাস কোড সঠিকভাবে পরিচালনা করে।
উদাহরণ: অ্যাসিঙ্ক্রোনাস অপারেশন পরীক্ষা করা
async-service.js
class AsyncService {
async fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ status: 'success', data: [1, 2, 3] });
}, 100);
});
}
async processData() {
const result = await this.fetchData();
return result.data.map(num => num * 2);
}
}
module.exports = AsyncService;
async-service.test.js
const assert = require('assert');
const AsyncService = require('./async-service');
async function testAsyncService() {
const service = new AsyncService();
// Test fetchData
const fetchResult = await service.fetchData();
assert.strictEqual(fetchResult.status, 'success', 'Should return success status');
assert.deepStrictEqual(fetchResult.data, [1, 2, 3], 'Should return correct data array');
// Test processData
const processResult = await service.processData();
assert.deepStrictEqual(processResult, [2, 4, 6], 'Should double each value in the array');
console.log('AsyncService tests passed!');
}
testAsyncService().catch(err => {
console.error('Test failed:', err);
});
ক্রমাগত ইন্টিগ্রেশন (CI)
ক্রমাগত একীকরণের সাথে আপনার পরীক্ষাগুলিকে স্বয়ংক্রিয় করা নিশ্চিত করে যে সেগুলি নিয়মিত চলছে:
সিআই সিস্টেম:
- প্রতিটি কোড পুশ বা পুল অনুরোধে চালানোর জন্য আপনার পরীক্ষা স্যুট কনফিগার করুন
- লিঙ্কিং কোড প্রতিরোধ করুন যা পরীক্ষার ব্যর্থতার কারণ হয়
- সময়ের সাথে পরীক্ষার কভারেজ নিরীক্ষণ করুন
সারাংশ
| মূল পয়েন্ট | ব্যাখ্যা |
|---|---|
| পরীক্ষার গুরুত্ব | নির্ভরযোগ্য Node.js অ্যাপ্লিকেশন তৈরির জন্য টেস্টিং গুরুত্বপূর্ণ |
| বিভিন্ন ধরনের পরীক্ষা | বিভিন্ন পরীক্ষার ধরন (ইউনিট, ইন্টিগ্রেশন, হোলিস্টিক) বিভিন্ন উদ্দেশ্যে ব্যবহার করা হয় |
| TDD | টেস্ট-চালিত উন্নয়ন (TDD) কোড গুণমান এবং নকশা উন্নত করে |
| পরীক্ষাযোগ্য কোড | ভাল সফ্টওয়্যার ডিজাইন অনুশীলন অনুসরণ করে পরীক্ষাযোগ্য কোড লিখুন |
| পরীক্ষার সরঞ্জাম | আপনার প্রকল্পের প্রয়োজন অনুসারে সঠিক পরীক্ষার সরঞ্জাম এবং কাঠামো ব্যবহার করুন |
| স্বয়ংক্রিয় পরীক্ষা | ক্রমাগত ইন্টিগ্রেশন সহ স্বয়ংক্রিয় পরীক্ষা |